package activiti.day04;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: 蔡翔
 * @Date: 2019/9/9 10:53
 * @Version 1.0
 *
 * 流程变量的测试
 */
public class VariableTest3 {

    /*//步骤 3
    // 完成任务 zhangsan --> lisi(判断流程变量 的请假天数 ，1天) --> zhaoliu（走人事分支）
    public static void main(String[] args) {
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService
        TaskService taskService = processEngine.getTaskService();

        //3.查询当前用户是否有任务
        String key = "myProcess_1";
        Task task = taskService.createTaskQuery().processDefinitionKey(key)
                .taskAssignee("zhaoliu")
                .singleResult();

        //初始化一些参数
        Map<String,Object> map = new HashMap<>();
        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        *//*map.put("holiday",holiday);
        *//*


        //4.判断task！= null 说明当前用户有任务。
        if(task!=null){
            //taskService.complete(task.getId(),map);  //***任务完成时 设置流程变量的值，在后面加上map，map里面包含了你需要传递的值。
            taskService.complete(task.getId());
            System.out.println("任务执行完毕");
        }


    }*/

    //新加入的：通过流程实例的id，来测试流程变量
    // 在流程执行到 某个步骤的时候，可以获取runtimeService对象，然后往特定的流程里面 加入你想加入的属性。
    public static void main(String[] args) {
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //3.流程定义的key问题，，myProcess_1
        //String key = "myProcess_1";

        Holiday holiday = new Holiday();
        holiday.setNum(5F);


        //4.通过实例的 id，来设置流程变量。
        // 第一个参数：流程实例id。 在act_ru_execution 表中找
        // 第二个参数：流程变量名 ==> 就是流程图上 对应 的holiday.num 的holiday。
        // 第三个参数：流程变量名对应的值。
        // 在act_ru_variable这张表里面，会有一条type为serializable的记录，
        // 其中这张表的BYTEARRAY_ID_字段记录着，act_ge_bytearray这张表里面主键记录，这张表的BYTES_存的就是holiday 这个对象，很大。
        runtimeService.setVariable("2501","holiday",holiday);  //这个方法一次只能设置一个值
        //runtimeService.setVariables("2501",map);    一次设置多个值,map中一次指定多个键值对。
    }

    /*//步骤 2
    // 启动流程实例，同时还要设置流程变量的值
    // act_ge_bytearray
    // act_ru_variable
    public static void main(String[] args) {
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //3.流程定义的key问题，，myProcess_1
        String key = "myProcess_1";

        *//*Map<String,Object> map = new HashMap<>();

        Holiday holiday = new Holiday();
        holiday.setNum(10F);
        //这样 map 的集合里面就放了 holiday 这个对象，这样与流程定义中的 ${holiday.num>3} 的holiday，就对应上了。
        map.put("holiday",holiday);*//*

        //4.启动流程实例，并且设置流程变量的值。 注意这里 是byKey ，虽然是依据bpmn的id。
        //注意 这里把map传入 startProcessInstanceByKey，map中的holiday 必须序列化，否则会报错异常的。
        //ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key,map);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key);

        //5.输出实例的信息
        System.out.println(processInstance.getName());
        System.out.println(processInstance.getProcessDefinitionId());

    }*/


    /*//步骤 1
    // 新的请假流程定义的部署
    public static void main(String[] args) {
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RepositoryService对象。
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //3.部署  (依据新的流程文件bpmn，部署新的流程)
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("test.bpmn")
                .addClasspathResource("test.png")
                .name("请假流程-流程变量")
                .deploy();

         System.out.println(deployment.getId());
        System.out.println(deployment.getName());
    }*/
}
